<?php
/**
 * Gestionnaire d'interface modele <-> frontoffice.
 * les méthodes accessibles par le selecteur $this depuis les fichiers de template
 * 
 * @package PWE.controler
 * @author Gmax <gmaxfr78@gmail.com>
 */
class controler_public extends controler{
    function __construct() {
        parent::__construct();
    }
    
    /**
     * deconnexion du user
     */
    public function deconnect(){
        session::delete('user');
        session::deleteCookie('user_id', '/');
    }
    /**
    * renvoi le contenu html
    * @return string
    * @todo detection du tag canonical de la target
    */
    public function getOutput(){
        parent::getOutput();
        
        // en-tete canonique
        if( !PWE::isMaintenanceMode() && navigation::getTarget()!==null && (navigation::getTarget()->type === 'page' || navigation::getTarget()->type === 'publication')){
            header("Link: <".navigation::getTarget()->getUrl().">; rel=canonical");
        }
        
        // ouverture du buffer
        ob_start();
        include($this->_getHeaderPath());
        include($this->_getMainPath());
        include($this->_getFooterPath());
        
        $retour = $this->_process(ob_get_contents()); //recupération et traitement du buffer
        ob_end_clean(); //fermeture du buffer
        
        bdd_sql::close();
        return $retour;
    }
    
    /**
     * renvoi la categorie active
     * @return \modele_category
     */
    public function getCategory(){
        return navigation::getCategory();
    }
    /**
     * renvoi le modele de page demandée
     * @return \modele|null
     */
    public function getTarget(){
        return navigation::getTarget();
    }
    /**
     * renvoi l'id de la cible
     * @return int
     */
    public function getTargetId(){
        return navigation::getTargetId();
    }
    /**
     * renvoi le type de modele de la target demandée
     * @return string
     */
    public function getTargetType(){
        return ($this->getTarget()!==null)?$this->getTarget()->type:'';
    }
    
    /**
     * renvoi l'identifiant de balise body de la page courante
     * @return string
     */
    public function getIdPage(){
        return (navigation::getTarget()!==null)?navigation::getTarget()->getPermalien()->getCleanedLien(false):'construction';
    }
    
    /**
     * indique si la cible posède une galerie
     * renvoi l'objet modele_galerie si il existe, false sinon
     * @return /modele_galerie|boolean
     */
    public function haveSlider(){
        $slider = modele_galerie::findByPermalien('galerie-'.$this->getTargetType().'-'.$this->getTargetId().modele_permalien::getExtensionByModele('galerie'), 'galerie');
        return ($slider!==null)?$slider:false;
    }
    /**
     * indique si la cible posède un media d'illustration
     * renvoi l'objet modele_media si il existe, false sinon
     * @return /modele_media|boolean
     */
    public function haveMedia(){
        $media = ($this->getTarget()!==null && $this->getTarget()->haveMedia())?$this->getTarget()->getMedia():null;
        return ($media!==null)?$media:false;
    }
    /**
     * indique si la cible posède une galerie
     * renvoi l'objet modele_galerie si il existe, false sinon
     * @return /modele_galerie|boolean
     */
    public function haveCategorySlider(){
        $slider = ($this->getCategory()!==null)?modele_galerie::findByPermalien('galerie-category-'.$this->getCategory()->getId().modele_permalien::getExtensionByModele('galerie'), 'galerie'):null;
        return ($slider!==null)?$slider:false;
    }
    /**
     * indique si la cible posède un media d'illustration
     * renvoi l'objet modele_media si il existe, false sinon
     * @return /modele_media|boolean
     */
    public function haveCategoryMedia(){
        $media = ($this->getCategory()!==null && $this->getCategory()->haveMedia())?$this->getCategory()->getMedia():null;
        return ($media!==null)?$media:false;
    }
    
    
    /**
     * renvoi le fil d'ariane formaté par template
     * @param string $sep
     * @return html
     */
    public function getBreadcrumb($sep='/'){
        $template = $this->_getBreadcrumbTemplatePath();
        $retour = '';
        if($template!==''){
            $dataBreadcrumb = navigation::getBreadcrumb();
            $separateurBreadcrumb = $sep;
            ob_start();
            include($template);
            $retour = ob_get_contents();
            ob_end_clean();
        }
        return $retour;        
    }
    
    /**
     * renvoi le code html du menu cible en fonction de son template 
     * @param int|string $menuName
     * @return type
     */
    public function getNavigation($menuName){
        return navigation::getNavigationMenu($menuName);
    }
    
    public function getContent(){
        include($this->_getTemplatePath());
    }
    
    /**
     * renvoi le titre seo de la page courante
     * @return string
     */
    public function getTitleSeo() {
        return ($this->getTarget()!==null)?$this->translate($this->getTarget(), 'titre_seo', $this->getLangueCode()):'';
    }
    /**
     * renvoi la description seo de la page courante
     * @return string
     */
    public function getDescriptionSeo() {
        return str_replace('"',"'",($this->getTarget()!==null)?$this->translate($this->getTarget(), 'description_seo', $this->getLangueCode()):'');
    }
   /**
    * renvoi le code de la langue active, default fr
    * @return string
    */
    public function getLangueCode(){
        $code = 'fr';
        if(session::get('lang')!==null) $code = session::get('lang');
        return $code;
    }
    /**
     * retourne un tableau contenant la page cible ou la liste des article de la categorie cible
     * @param int $start
     * @param int $limit
     * @param boolean $public 
     * @return array /modele_publication|/modelde_page
     */
    public function getPublications($start=0,$limit=0,$public=true,$desc=true){
        $listePublications = array();
        
        if($this->getTarget()!==null){
            if($this->getTargetType()==='category'||$this->getTargetType()==='tag'){
                $listePublications = $this->getTarget()->getPublications($start,$limit,$public,$desc);
            }else{
                $listePublications[] = $this->getTarget();
            }
        }
        return $listePublications;
    }
    /**
     * renvoi le nombre de publication de la catégory courante
     * @param boolean $public
     * @return int
     */
    public function getNombrePublications($limit=0,$public=true){
        return count($this->getPublications(0,$limit,$public));
    }


    public function translate($objet,$property,$lang=''){
        if($property==='permalien'){
            $retour = $object->getTranslatedUrl($lang);
        }
        $retour = controler_translate::doTranslate($objet, ($lang!=='')?$lang:session::get('lang'), $property);
        
        return $retour;
    }
    /**
     * 
     * @return string
     */
    public function getThemeCssURL(){
        return self::getBaseURL() . THEME_PATH . self::getTheme() . '/theme.css';
    }
    /**
     * 
     * @return string
     */
    public function getThemeJsURL(){
        return self::getBaseURL() . THEME_PATH . self::getTheme() . '/script.js';
    }
    
    /**
     * retourne le nom du template de la cible
     * @return string
     */
    public function getTemplateName(){
        $template = '';
        if(navigation::is404()){
            $template = '404';
        }else{
            if($this->getTarget()!==null){
                if(file_exists(THEME_PATH . self::getTheme() . '/' .$this->getTarget()->getTemplate() . '.php')){
                    $template = $this->getTarget()->getTemplate();
                }else{
                    $template = PWE::getDefaultTemplate();
                }
            }else{
                $template = PWE::getDefaultTemplate();
            }
        }
        return $template;
    }
    
    /* private methodes */
    private function _getTemplatePath(){
        $template = THEME_PATH . self::getTheme() . '/';
        if(navigation::is404()){
            $template .= '404.php';
        }elseif(PWE::isMaintenanceMode()){
            if(file_exists($template.'maintenance.php')){
                $template .= 'maintenance.php';
            }else{
                $template = THEME_PATH . 'default/maintenance.php';
            }
        }else{
            if($this->getTarget()!==null){
                if(file_exists($template.$this->getTarget()->getTemplate() . '.php')){
                    $template .= $this->getTarget()->getTemplate() . '.php';
                }else{
                    $template .= PWE::getDefaultTemplate() . '.php';
                }
            }else{
                $template .= PWE::getDefaultTemplate() . '.php';
            }
        }
        return $template;
    }
    /* private methodes */
    
    /** 
     * @return string
     */
    private function _getBreadcrumbTemplatePath(){
        $template = THEME_PATH . self::getTheme() . '/';
        if($this->getTarget()!==null){
            if(file_exists($template.$this->getTarget()->getTemplate() . '-breadcrumb.php')){
                $template .= $this->getTarget()->getTemplate() . '-breadcrumb.php';
            }else{
                $template .= 'breadcrumb.php';
            }
        }else{
            $template .= 'breadcrumb.php';
        }
        if(!file_exists($template)){
            $template = '';
        }
        return $template;
    }
    /** 
     * @return string
     */
    private function _getHeaderPath(){
        return THEME_PATH . self::getTheme().'/header.php';
    }
    /** 
     * @return string
     */
    private function _getMainPath(){
        return THEME_PATH . self::getTheme().'/main.php';
    }
    /** 
     * @return string
     */
    private function _getFooterPath(){
        return THEME_PATH . self::getTheme().'/footer.php';
    }
}
?>